package pharao.client.views.game.landkarte.ort.basics;

import hmvc4gwt.client.event.IHmvcEvent;
import hmvc4gwt.framework.client.events.CloseViewEvent;
import hmvc4gwt.framework.client.events.RemoveViewEvent;

import com.google.gwt.user.client.History;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

import pharao.client.dto.OrtDTO;
import pharao.client.i18ln.GuiText;
import pharao.client.views.events.GetModelDataEvent;
import pharao.client.views.events.SetModelDataEvent;
import pharao.client.views.game.landkarte.LandkarteModel;
import pharao.client.views.game.landkarte.ort.AOrtView;
import pharao.client.views.game.landkarte.ort.basics.events.ShowOrtBasicViewEvent;
import pharao.client.views.game.landkarte.ort.exam.ExamController;
import pharao.client.views.game.landkarte.ort.exam.ExamModel;
import pharao.client.views.game.landkarte.ort.exam.ExamView;
import pharao.client.views.game.landkarte.ort.exam.events.ShowExamViewEvent;
import pharao.client.views.game.landkarte.ort.status.events.ShowOrtStatusViewEvent;
import pharao.client.views.game.landkarte.ort.training.TrainingController;
import pharao.client.views.game.landkarte.ort.training.TrainingModel;
import pharao.client.views.game.landkarte.ort.training.TrainingView;
import pharao.client.views.game.landkarte.ort.training.events.ShowTrainingViewEvent;
import pharao.client.views.game.landkarte.ort.tutorium.TutoriumController;
import pharao.client.views.game.landkarte.ort.tutorium.TutoriumView;
import pharao.client.views.game.landkarte.ort.tutorium.events.ShowTutoriumViewEvent;
import pharao.client.views.game.menu.MenuPanel;
import pharao.client.views.game.navigation.GameNavigationModel;

public class OrtBasicsView extends AOrtView {
	
	private Hyperlink hyperlinkMap		= LandkarteModel.getHyperlinkMap();
	private Hyperlink hyperlinkExam 	= new Hyperlink(GuiText.constants.link_game_map_ort_menu_exam(), null);	
	private Hyperlink hyperlinkStatus 	= new Hyperlink(GuiText.constants.link_game_map_ort_menu_status(), null);
	private Hyperlink hyperlinkTraining = new Hyperlink(GuiText.constants.link_game_map_ort_menu_training(), null);
	private Hyperlink hyperlinkTutorium = new Hyperlink(GuiText.constants.link_game_map_ort_menu_tutorium(), null);
	
	/**
	 * Container für das Menü
	 */
	private MenuPanel menuPanel = new MenuPanel();
	
	/**
	 * enthält den Titel und den Text
	 */
	private VerticalPanel titlePanel = new VerticalPanel();
	
	/**
	 * enthält das OrtDTO
	 */
	private OrtDTO ortDTO;

	public void initImpl() {
		
		Label labelTitle = new Label(GuiText.constants.text_game_map_ort_basics_title());
		Label labelBeschreibung = new Label(GuiText.constants.text_game_map_ort_basics_beschreibung());
		
		labelTitle.setStyleName("header1");
		labelBeschreibung.setStylePrimaryName("text");
		
		titlePanel.add(labelTitle);
		titlePanel.add(labelBeschreibung);		
		
		getController().register(SetModelDataEvent.class, this);
		getController().register(ShowOrtBasicViewEvent.class, this);
		
		
		/*
		 * Clicklistener zu den Hyperlinks hinzufügen
		 */
		ClickListener listener = new ClickListener() {
			public void onClick(Widget sender) {
				handleMenuEvent(sender);
			}
		};
		
		hyperlinkExam.addClickListener(listener);
		hyperlinkStatus.addClickListener(listener);
		hyperlinkTraining.addClickListener(listener);
		hyperlinkTutorium.addClickListener(listener);
		
		/*
		 * Hyperlinks zum Container hinzufügen
		 */
		menuPanel.add(hyperlinkTutorium);
		menuPanel.add(hyperlinkTraining);
		menuPanel.add(hyperlinkExam);
		menuPanel.add(hyperlinkStatus);
	
		/*
		 * OrtDTO holen und View initialisieren
		 */
		getController().fireEventLocal(new GetModelDataEvent());
		
		/*
		 * Text des Links zur Landkarte ändern
		 */
		hyperlinkMap.setText(GuiText.constants.link_game_map_backToMap());
	}

	public void handleEventImpl(IHmvcEvent event) {
		
		if (event instanceof SetModelDataEvent) {
			
			if (event.getPayload() instanceof OrtDTO) {
				OrtDTO ortDTO = (OrtDTO) event.getPayload();
				setOrtDTO(ortDTO);
				initView(ortDTO);
			}			
		} else if (event instanceof ShowOrtBasicViewEvent) {
			getController().fireEvent(new CloseViewEvent(), false, false, true);
			showMenu();
		}
		
	}

	/**
	 * behandelt die Menu-Links
	 */
	private void handleMenuEvent(Widget sender) {
		
		getController().fireEvent(new RemoveViewEvent(this), true, false, false);
		
		if (sender == hyperlinkTutorium) {
			showTutorium();
		} else if (sender == hyperlinkTraining) {
			showTraining();
		} else if (sender == hyperlinkExam) {
			showExam();
		} else if (sender == hyperlinkStatus) {
			showStatus();
		}
		
	}

	private void initView(OrtDTO ortDTO) {
		setOrtDTO(ortDTO);
		
//		if (ortDTO.getOrtStatus().isEnabled() == false) {
//			/*
//			 * TODO: Anzeigen das der Ort noch nicht freigeschaltet ist
//			 */
//			
//			return;
//		}
		
		/*
		 * Wurde der Ort schon besucht
		 */
		if (ortDTO.getOrtStatus().isVisited()) {
			/*
			 * Ort-Menü anzeigen
			 */
			showMenu();
		} else {
			/*
			 * Story Anzeigen
			 */
			History.newItem(GameNavigationModel.linkStory);
		}
	}

	
	private void setOrtDTO(OrtDTO ortDTO) {
		this.ortDTO = ortDTO;
	}
	
	private void showExam() {
		getController().addChildComponent(new ExamController(), new ExamModel(), new ExamView());
		getController().fireEvent(new ShowExamViewEvent(), false, false, true);
	}

	private void showMenu() {
		
		/*
		 * aktuellen Ihnalt löschen
		 */
		clear();
		
		/*
		 * Menü-Container zu View hinzufügen
		 */
		add(titlePanel);
		/*
		 * Link zur Karte hinzufügen
		 */
		add(hyperlinkMap);
		add(menuPanel.getMenuWidget());		
	}

	/**
	 * zeigt den Ortstatus an
	 */
	private void showStatus() {
		
		getController().fireEventLocal(new CloseViewEvent());
		getController().fireEvent(new ShowOrtStatusViewEvent(), false, false, true);
		
	}

	private void showTraining() {
		getController().addChildComponent(new TrainingController(), new TrainingModel(), new TrainingView());
		getController().fireEvent(new ShowTrainingViewEvent(), false, false, true);
	}

	private void showTutorium() {
		getController().addChildComponent(new TutoriumController(), new TutoriumView());
		getController().fireEvent(new ShowTutoriumViewEvent(), false, false, true);
	}

	public void terminate() {
		// TODO Auto-generated method stub
		
	}
}

